import common.TreeNode;

import java.util.*;

/**
 * 103. Binary Tree Zigzag Level Order Traversal  二叉树的锯齿形层序遍历
 * https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/
 */
class BinaryTreeZigzagLevelOrderTraversal {
    /**
     *      方法： 使用双端队列实现二叉树的锯齿形层序遍历
     *
     *      Args:
     *          root: Optional[TreeNode] - 二叉树的根节点
     *
     *      Returns:
     *          List[List[int]]: 锯齿形层序遍历结果,每个子列表包含同一层的节点值
     *
     *      Time: O(n) - 其中n是二叉树的节点数，每个节点只被访问一次
     *
     *      Space: O(w) - 其中w是二叉树的最大宽度，队列中最多存储一层的所有节点
     */
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        if(root == null){
            return ans;
        }
        Queue<TreeNode> q = new ArrayDeque<>();
        q.offer(root);
        boolean orderLeft = true;
        while(!q.isEmpty()){
            Deque<Integer> levelList = new LinkedList<>();
            int size = q.size();
            for(int i = 0; i< size; i++){
                TreeNode node = q.poll();
                if((ans.size() % 2) != 0){
                    //如果当前层是奇数层（如第 1 层），则从右到左遍历（offerFirst）
                    levelList.offerFirst(node.val);
                }else{
                    //如果当前层是偶数层（如第 0 层），则从左到右遍历（offerLast）
                    levelList.offerLast(node.val);
                }
                if(node.left != null) q.offer(node.left);
                if(node.right != null) q.offer(node.right);
            }
            ans.add(new LinkedList<Integer>(levelList));
        }
        return ans;
    }
}